Sequelize

✒️ 2025-06-29 21:39 내용 수정


ORM(Object-Relational Mapping) 라이브러리


초기설정

  1. VSC 터미널에서 npm i sequelize sequelize-cli으로 ORM 관련 패키지를 설치한다.
  2. 만약 mysql2가 설치되어 있지 않다면 npm i mysql2로 mysql2도 설치한다.

node_sequelize 1.png

  1. VSC 터미널에서 npx sequelize init로 sequelize를 실행해 초기 설정을 해준다.

node_sequelize 2.png

  1. 명령어 생성 후 생긴 config 폴더의 config.json 파일에서 DB를 용도별로 설정할 수 있다.
    • 개발을 위한 db 연결을 설정하는데, 기존에 없던 db라면 새로 생성해준다.
    • development : 개발을 위한 DB
    • test : 테스트를 위한 DB
    • production : 실제 배포나 서비스를 위한 DB
{
  "development": { // 개발용 DB
    "username": "사용자",
    "password": "비밀번호",
    "database": "DB이름",
    "host": "127.0.0.1", // localhost
    "dialect": "mysql",
    "port" : "3306" // port가 기본값이 아니라면 지정 필요
  },
  "test": { // 테스트용 DB
    "username": "사용자",
    "password": "비밀번호",
    "database": "DB이름",
    "host": "127.0.0.1", // localhost
    "dialect": "mysql"
  },
  "production": { // 배포 및 서비스를 위한 DB
    "username": "사용자",
    "password": "비밀번호",
    "database": "DB이름",
    "host": "127.0.0.1", // localhost
    "dialect": "mysql"
  }
}

node_sequelize 3.png


Sequelize 인스턴스 생성

const { Sequelize } = require('sequelize');

// 연결용 url 사용
const sequelize = new Sequelize('connection url');

// 연결을 위한 매개변수 전달
const sequelize = new Sequelize('database', 'username', 'password', {
	// option에는 객체로 전달
	host : 'localhost',
	dialect : 'mysql',
	port : '3306'
});
try {
    sequelize.authenticate();
    console.log('연결 성공');
} catch (error) {
  console.error('연결 실패');
}

sequelize config 수정하기

  1. config 폴더의 config.json 파일에서 사용하려는 DB의 설정을 확인한다.
    • 기본값은 3306으로, 기본값이 아닌 포트를 사용 중이라면 꼭 추가해야 DB와 연결된다.
    • 각 항목을 나중에 index.js에서 설정할 때 사용할 예정이다.
{
  "development": {
    "username": "root",
    "password": "비밀번호",
    "database": "DB이름",
    "host": "127.0.0.1",
    "dialect": "mysql",
    "port" : "3307" // 기본값은 3306으로, 기본값이 아닌 포트를 사용 중이라면 꼭 추가
  },
  "test": {
    "username": "root",
    "password": null,
    "database": "database_test",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  "production": {
    "username": "root",
    "password": null,
    "database": "database_production",
    "host": "127.0.0.1",
    "dialect": "mysql"
  }
}
  1. models 폴더에서 모델 파일의 내용을 모듈화할 수 있도록 수정한다.
// customModelfile.js

'use strict'; // strict mode 사용

const { Model } = require('sequelize'); // Model 클래스 상속을 위해 가져오기

module.exports = (sequelize, DataTypes) => { // (sequelize, DataTypes)는 다른 파일에 존재

  class CustomModel extends Model {} // 테이블 클래스가 Model 클래스를 상속받음
  
  CustomModel.init({
  	// Model attribute 설정
	columnName1 : { // 추가할 테이블의 컬럼명으로 지정
		type : DataTypes.STRING, // 데이터 타입 지정
		allowNull : false
	},
	columnName2 : {
		type : DataTypes.INTEGER,
		allowNull : true
	},
    columnName3: DataTypes.STRING, // 다른 옵션이 없다면 간단하게 타입만 작성
    columnName4: DataTypes.STRING
  }, {
    sequelize, // DB 연결에 필요한 sequelize 인스턴스
    modelName: 'ModelName',
  });
  
  return CustomModel; // ModelName 클래스를 다른 파일로 전달
};

sequelize_dbconfig 2.png

  1. index.js 파일에서 Sequelize 인스턴스를 만들어 DB 연결 설정을 해주고, 모델 파일에서 함수를 가져와 CustomModel 인스턴스를 만든다.
// index.js

'use strict';

const Sequelize = require('sequelize'); // Sequelize 사용
const config = require('../config/config.json'); // DB 설정이 있는 config.json 파일 가져옴

// config.json 파일의 development 객체의 properties를 변수에 저장
const {username, password, database, host, dialect, port} = config.development;

// Sequelize 인스턴스 생성
const sequelize = new Sequelize(database, username, password, {host, dialect, port}); // port 설정을 했다면 port도 전달

// customModelfile에 있는 함수 호출, sequelize와 Sequelize.DataTypes를 전달해서 CustomModel 인스턴스 생성
const CustomModel = require('./customModelfile')(sequelize, Sequelize.DataTypes);

const db = {} // db 객체 만들기
db.CustomModel = CustomModel; // db 객체에 CustomModel 저장
module.exports = db; // db 객체 내보내기

sequelize_dbconfig 3.png

  1. server.js 파일이 없다면 새로 만들고, 기존에 mysql2로 연동했던 파일이 있으면 파일을 수정한다.
// 1. require
const express = require('express');
const app = express();

// ORM을 통한 DB 접속
const db = require('./models/index'); // index.js에서 내보낸 db 객체 가져오기
const { CustomModel } = db; // db 객체에 있는 CustomModel 저장하기

// 2. use, set
app.use(express.static(__dirname + "/public"));
app.set('view engine', 'ejs');
app.use(express.json());
app.use(express.urlencoded({'extended':'true'}));

// 3. listen
app.listen('8080', () => {
    console.log('접속 http://localhost:8080');
});

// 4. routing
app.get('/', (request, response) => {
    response.render('main.ejs');
});

// db에서 가져온 정보를 웹 페이지에 보여주기 위해 라우팅과 데이터 포워딩 설정
app.get('/customModel', async (request, response) => {

    const { param } = request.query; // request의 query string을 저장

	// 특정 query string의 여부에 따라 검색 결과를 다르게 설정
    if (param != null) { // query string이 있을 때
        const customParamResult = await CustomModel.findAll({where:{param}}); // SELECT * FROM table WHERE param = x;
        // where : {cols: request.query} 
        response.render('custom.ejs', { customData: customParamResult });
    } else { // query string이 없을 때
        const customResult = await CustomModel.findAll(); // SELECT * FROM table;
        response.render('custom.ejs', { customData: customResult });
    }
});

sequelize_dbconfig 1.png

  1. 이제 DB에서 가져온 데이터를 보여줄 페이지를 간단하게 만든다.
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        table{
            border: 1px solid black;
            border-collapse: collapse;
            text-align: center;
        }
        th, td{border: 1px solid black;}
    </style>
</head>
<body>
    <section class="sec">
        <div class="container">
            <div class="row">
                <div class="col">
                    <table>
                        <tr>
                            <th>id</th>
                            <th>이름</th>
                            <th>부서</th>
                            <th>직종</th>
                            <th>이메일</th>
                            <th>전화번호</th>
                        </tr>
                        
                        <% for(let i = 0; i < employee.length; i++) { %>
                            <tr>
                                <td><%= employee[i].id %></td>
                                <td><%= employee[i].name %></td>
                                <td><%= employee[i].team %></td>
                                <td><%= employee[i].position %></td>
                                <td><%= employee[i].emailAddress %></td>
                                <td><%= employee[i].phoneNumber %></td>
                            </tr>
                        <% } %>
                    </table>
                </div>
            </div>
        </div>
    </section>
</body>
</html>

sequelize_dbconfig 4.png

sequelize_dbconfig 5.png